﻿using SupportLayer.Enums;
using SupportLayer.Objetos.Produto;
using System;
using System.Collections.Generic;
using System.Data.Entity.Core;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DataLayer.Produto
{
	public class ControllerProduto
	{
		//	ContextoBD Contexto = new ContextoBD();

		//	public ControllerProduto(ContextoBD _contexto)
		//	{
		//		Contexto = _contexto;
		//	}

		//	#region Avaliação
		//	public void InsertAvaliacao(AvaliacaoClass Avaliacao)
		//	{
		//		try
		//		{
		//			new Repository<AvaliacaoClass>(Contexto).Insert(Avaliacao);
		//		}
		//		catch (Exception)
		//		{
		//			throw;
		//		}
		//	}
		//	#endregion
		//	#region Categoria
		//	public CategoriaClass SelectCategoria(int CategoriaID)
		//	{
		//		try
		//		{
		//			return new Repository<CategoriaClass>(Contexto).Select(a => a.ID == CategoriaID).SingleOrDefault();
		//		}
		//		catch (Exception)
		//		{

		//			throw;
		//		}
		//	}
		//	public List<CategoriaClass> GetCategorias()
		//	{
		//		try
		//		{
		//			return new Repository<CategoriaClass>(Contexto).Select(a => a.ID == a.ID).ToList();
		//		}
		//		catch (Exception)
		//		{

		//			throw;
		//		}
		//	}
		//	#endregion
		//	#region Categoria Master
		//	public CategoriaMasterClass SelectCategoriaMaster(Int16 CategoriaMasterID)
		//	{
		//		try
		//		{
		//			return new Repository<CategoriaMasterClass>(Contexto).Select(a => a.ID == CategoriaMasterID).SingleOrDefault();
		//		}
		//		catch (Exception)
		//		{
		//			throw;
		//		}
		//	}
		//	public List<CategoriaMasterClass> GetCategoriaMaster()
		//	{
		//		try
		//		{
		//			return new Repository<CategoriaMasterClass>(Contexto).Select(a => a.ID == a.ID).ToList();
		//		}
		//		catch (Exception)
		//		{
		//			throw;
		//		}
		//	}
		//	#endregion
		//	#region Destaques
		//	public List<DestaqueClass> GetDestaques()
		//	{
		//		try
		//		{
		//			List<DestaqueClass> lstDestaques = new Repository<DestaqueClass>(Contexto).Select(a => a.ID == a.ID).ToList();

		//			lstDestaques.ForEach(a => a.Produto = SelectProduto(a.ProdutoID, true));
		//			return lstDestaques;
		//		}
		//		catch (Exception)
		//		{
		//			throw;
		//		}
		//	}
		//	#endregion
		//	#region Dividir
		//	public Int64 InsertDividir(DividirClass Dividir)
		//	{
		//		Repository<DividirClass> RepoDividir = new Repository<DividirClass>(Contexto);
		//		try
		//		{
		//			RepoDividir.Insert(Dividir);
		//			RepoDividir.SaveChanges();
		//			return Dividir.ID;
		//		}
		//		catch (DbUpdateConcurrencyException)
		//		{
		//			Contexto.Entry(Dividir).Reload();
		//			Contexto.Dividir.Add(Dividir);
		//			Contexto.SaveChanges();
		//			return Dividir.ID;
		//		}
		//		catch (Exception)
		//		{
		//			throw;
		//		}
		//	}
		//	public DividirClass SelectDividir(Int64 DividirID)
		//	{
		//		try
		//		{
		//			return new Repository<DividirClass>(Contexto).Select(a => a.ID == DividirID).SingleOrDefault();
		//		}
		//		catch (Exception)
		//		{
		//			throw;
		//		}
		//	}
		//	public void UpdateDividir(DividirClass Dividir)
		//	{
		//		try
		//		{
		//			Repository<DividirClass> RepoDividir = new Repository<DividirClass>(Contexto);
		//			RepoDividir.Update(Dividir);
		//			RepoDividir.SaveChanges();
		//		}
		//		catch (Exception)
		//		{
		//			throw;
		//		}
		//	}
		//	#endregion
		//	#region Especificação
		//	public List<EspecificacaoClass> GetEspecificacoes(Int64 ProdutoID)
		//	{
		//		try
		//		{
		//			return new Repository<EspecificacaoClass>(Contexto).Select(a => a.ProdutoID == ProdutoID).OrderBy(b => b.Tamanho).ToList();
		//		}
		//		catch (Exception)
		//		{
		//			throw;
		//		}
		//	}
		//	#endregion
		//	#region Fotos
		//	public List<FotosClass> SelectFotos(Int64 ProdutoID)
		//	{
		//		try
		//		{
		//			return new Repository<FotosClass>(Contexto).Select(a => a.ProdutoID == ProdutoID).ToList();
		//		}
		//		catch (Exception)
		//		{

		//			throw;
		//		}
		//	}
		//	public int GetQuantidadeFotos(Int64 ProdutoID)
		//	{
		//		try
		//		{
		//			return Convert.ToInt32(new Repository<FotosClass>(Contexto).Count(a => a.ProdutoID == ProdutoID));
		//		}
		//		catch (Exception)
		//		{

		//			throw;
		//		}
		//	}
		//	#endregion
		//	#region Marca
		//	public MarcaClass SelectMarca(int ID)
		//	{
		//		try
		//		{
		//			return new Repository<MarcaClass>(Contexto).Select(a => a.ID == ID).Single();
		//		}
		//		catch (Exception)
		//		{
		//			throw;
		//		}
		//	}
		//	public List<MarcaClass> GetMarcas()
		//	{
		//		try
		//		{
		//			return new Repository<MarcaClass>(Contexto).Select(a => a.ID == a.ID).ToList();
		//		}
		//		catch (Exception)
		//		{

		//			throw;
		//		}
		//	}
		//	#endregion
		//	#region Produtos
		//	public Int64 InsertProduto(ProdutoClass Produto)
		//	{
		//		try
		//		{
		//			Repository<ProdutoClass> RepoProduto = new Repository<ProdutoClass>(Contexto);
		//			RepoProduto.Insert(Produto);
		//			RepoProduto.SaveChanges();
		//			return Produto.ID;
		//		}
		//		catch (Exception)
		//		{
		//			throw;
		//		}
		//	}
		//	public ProdutoClass SelectProduto(Int64 ProdutoID, bool CarregarMarca = false, bool CarregarCategoria = false)
		//	{
		//		try
		//		{
		//			ProdutoClass Produto = new Repository<ProdutoClass>(Contexto).Select(a => a.ID == ProdutoID).Single();

		//			if (CarregarMarca)
		//			{
		//				Produto.Marca = new MarcaClass();
		//				Produto.Marca = SelectMarca(Produto.MarcaID);
		//			}
		//			if (CarregarCategoria)
		//			{
		//				Produto.Categoria = new CategoriaClass();
		//				Produto.Categoria = SelectCategoria(Produto.CategoriaID);
		//			}

		//			return Produto;
		//		}
		//		catch (Exception)
		//		{

		//			throw;
		//		}
		//	}
		//	public List<ProdutoClass> GetProdutos(int _skip, int _take, Ordenacao _ordenacao, string _filtro, out int _numProdutos)
		//	{
		//		try
		//		{
		//			Repository<ProdutoClass> RepoProduto = new Repository<ProdutoClass>(Contexto);

		//			List<ProdutoClass> lstProdutos = new List<ProdutoClass>();
		//			List<ProdutoClass> lstProdutosReais = new List<ProdutoClass>();
		//			int numProd = 0;
		//			_numProdutos = 0;

		//			Action carregaListas = delegate()
		//			{
		//				List<MarcaClass> lstMarcas = new Repository<MarcaClass>(Contexto).Select(a => a.Descricao.Contains(_filtro)).ToList();
		//				List<CategoriaClass> lstCategorias = new Repository<CategoriaClass>(Contexto).Select(a => a.Descricao.Contains(_filtro)).ToList();
		//				List<CategoriaMasterClass> lstCategoriaMaster = new Repository<CategoriaMasterClass>(Contexto).Select(a => a.Descricao.Contains(_filtro)).ToList();

		//				lstMarcas.ForEach(a => lstProdutos.AddRange(RepoProduto.Select(b => b.MarcaID == a.ID).ToList()));
		//				lstCategorias.ForEach(a => lstProdutos.AddRange(RepoProduto.Select(b => (b.CategoriaID == a.ID) || (b.CategoriaSecundariaID == a.ID)).ToList()));
		//				lstCategoriaMaster.ForEach(a => lstProdutos.AddRange(RepoProduto.Select(b => b.CategoriaMasterID == a.ID).ToList()));
		//			};

		//			Action<List<ProdutoClass>> limpaLista = delegate(List<ProdutoClass> lstProd)
		//			{
		//				Repository<EspecificacaoClass> RepoEspecificacao = new Repository<EspecificacaoClass>(Contexto);

		//				foreach (ProdutoClass Produto in lstProd)
		//				{
		//					int quant = (int)RepoEspecificacao.Count(a => a.ProdutoID == Produto.ID && a.Quantidade > 0);
		//					if (quant > 0)
		//					{
		//						lstProdutosReais.Add(Produto);
		//					}
		//				}

		//				numProd = (int)lstProdutosReais.Count;
		//				lstProdutosReais = lstProdutosReais.Skip(_skip).Take(_take).ToList();
		//			};

		//			switch (_ordenacao)
		//			{
		//				case Ordenacao.Name:
		//					if (_filtro.Equals(string.Empty))
		//					{
		//						limpaLista(RepoProduto.Select(a => a.ID == a.ID).OrderByDescending(b => b.Modelo).ToList());
		//						_numProdutos = numProd;
		//					}
		//					else
		//					{
		//						carregaListas();
		//						limpaLista(lstProdutos.OrderByDescending(b => b.Modelo).ToList());
		//						_numProdutos = numProd;
		//					}
		//					break;
		//				case Ordenacao.Cheaper:
		//					if (_filtro.Equals(string.Empty))
		//					{
		//						limpaLista(RepoProduto.Select(a => a.ID == a.ID).OrderByDescending(b => b.Preco).ToList());
		//						_numProdutos = numProd;
		//					}
		//					else
		//					{
		//						carregaListas();
		//						limpaLista(lstProdutos.OrderByDescending(b => b.Preco).ToList());
		//						_numProdutos = numProd;
		//					}
		//					break;
		//				case Ordenacao.Expensive:
		//					if (_filtro.Equals(string.Empty))
		//					{
		//						limpaLista(RepoProduto.Select(a => a.ID == a.ID).OrderByDescending(b => b.Preco).ToList());
		//						_numProdutos = numProd;
		//					}
		//					else
		//					{
		//						carregaListas();
		//						limpaLista(lstProdutos.OrderBy(b => b.Preco).ToList());
		//						_numProdutos = numProd;
		//					}
		//					break;
		//				case Ordenacao.Newest:
		//				default:
		//					if (_filtro.Equals(string.Empty))
		//					{
		//						limpaLista(RepoProduto.Select(a => a.ID == a.ID).OrderByDescending(b => b.Data).ToList());
		//						_numProdutos = numProd;
		//					}
		//					else
		//					{
		//						carregaListas();
		//						limpaLista(lstProdutos.OrderByDescending(b => b.Data).ToList());
		//						_numProdutos = numProd;
		//					}
		//					break;
		//			}
		//			return lstProdutosReais;
		//		}
		//		catch (Exception)
		//		{
		//			throw;
		//		}
		//	}
		//	public List<ProdutoClass> GetProdutosByCodigo(int _skip, int _take, Ordenacao _ordenacao, string _filtro, out int _numProdutos)
		//	{
		//		try
		//		{
		//			List<EspecificacaoClass> lstEspecificacao = new List<EspecificacaoClass>();

		//			lstEspecificacao.AddRange(new Repository<EspecificacaoClass>(Contexto).Select(a => a.CodigoLoja == _filtro));

		//			List<ProdutoClass> lstProdutos = new List<ProdutoClass>();
		//			Repository<ProdutoClass> RepoProduto = new Repository<ProdutoClass>(Contexto);

		//			lstEspecificacao.ForEach(a => lstProdutos.Add(RepoProduto.Select(b => a.ProdutoID == b.ID).Single()));

		//			_numProdutos = lstProdutos.Count;

		//			switch (_ordenacao)
		//			{
		//				case Ordenacao.Name:
		//					return lstProdutos.OrderByDescending(b => b.Modelo).Skip(_skip).Take(_take).ToList();
		//				case Ordenacao.Cheaper:
		//					return lstProdutos.OrderByDescending(b => b.Preco).Skip(_skip).Take(_take).ToList();
		//				case Ordenacao.Expensive:
		//					return lstProdutos.OrderBy(b => b.Preco).Skip(_skip).Take(_take).ToList();
		//				case Ordenacao.Newest:
		//				default:
		//					return lstProdutos.OrderByDescending(b => b.Data).Skip(_skip).Take(_take).ToList();
		//			}
		//		}
		//		catch (Exception)
		//		{
		//			throw;
		//		}
		//	}
		//	public void UpdateProduto(ProdutoClass Produto)
		//	{
		//		try
		//		{
		//			Repository<ProdutoClass> RepoProduto = new Repository<ProdutoClass>(Contexto);
		//			RepoProduto.Update(Produto);
		//			RepoProduto.SaveChanges();
		//		}
		//		catch (Exception)
		//		{
		//			throw;
		//		}
		//	}
		//	#endregion
		//	#region Promoção
		//	public PromocaoClass SelectPromocao(Int64 ProdutoID)
		//	{
		//		try
		//		{
		//			return new Repository<PromocaoClass>(Contexto).Select(a => a.ProdutoID == ProdutoID).SingleOrDefault();
		//		}
		//		catch (Exception)
		//		{
		//			throw;
		//		}
		//	}
		//	#endregion
		//}
	}
}